/**
 * Number
 */

/**
 * 1.浮点值
 *  - 数值中必须包含小数点，且小数点后面至少有一个数字
 *  - 小数点前面不是必须有整数，但是推荐加上
 *  - 如果数值本身就是整数，即小数点后面跟着0的会被转换为整数
 *  - 科学计数法 e 默认情况下，ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法
 */
let float1 = 1.1
let float2 = 0.1
let float3 = 0.1
let float4 = 11.0 //会被当做整数11来处理
let float5 = 3.14e7 //31400000
let float6 = 3.14e-7 //3.14*10^-7

console.log(float1, float2, float3, float4, float5, float6)

// 浮点值的精确度最高可达 17 位小数，但在算术计算中远不如整数精确。例如，0.1 加 0.2 得到的不是0.3而是0.300 000 000 000 000 04
// 永远不要测定某个特定的浮点值
// 原因是ECMAScript使用了IEEE754数值
console.log(0.1 + 0.2)

/**
 * 2.值范围
 */
//值范围 MIN_VALUE--MAX_VALUE
console.log(Number.MIN_VALUE) //5e-324
console.log(Number.MAX_VALUE) //1.7976931348623157e+308
console.log(Number.MIN_SAFE_INTEGER) //-9007199254740991
console.log(Number.MAX_SAFE_INTEGER) //9007199254740991
console.log(Number.POSITIVE_INFINITY)

//要确定一个数是不是有限大，即介于MIN_VALUE--MAX_VALUE之间，可以使用
let res = Number.MAX_VALUE + Number.MAX_VALUE
console.log(res) //Infinity
console.log(isFinite(res)) //false

/**
 * 3. NaN
 *   - 意思是不是数值（Not a Number）
 *   - 用于表示本来要返回数值的操作失败了
 *   - 0/0 0/-0都返回NaN
 *   - 如果分子是非零值，分母是0则返回Infinity和-Infinity
 */
console.log(0 / 0) //NaN
console.log(1 / 0) //Infinity
console.log(1 / -0) //-Infinity
//任何设计NaN的操作都返回NaN
console.log(Infinity / NaN) //NaN
//NaN不等于包括NaN在内的任何值
console.log(NaN == NaN) //false

//isNaN()用于这个参数是否不是数值，把一个值传给isNaN后，该函数会尝试将它转换为数值
//能转换为数值的有 字符串数值如'10.1'或布尔值
//任何不能转换为数值的值都会导致该函数返回true  is not a number
console.log(isNaN(true)) //false
console.log(isNaN(false)) //false
console.log(isNaN('10.1')) //false
console.log(isNaN('1')) //false
console.log(isNaN(NaN)) //true
console.log(isNaN('blue')) //true
console.log(isNaN(undefined)) //true
console.log(isNaN(null)) //false

/**
 * 4. 数值转换
 *  ① Number() 用于任何数据类型
 *  ② parseInt() 用于字符串 如果第一个字符不是数值字符、加号或减号则立即返回NaN
 *               如果第一个字符是其一，则继续检查碰到非数值字符即结束，截取前面的部分作为结果
 *               可以接收第二个参数用于指定底数(进制数)，建议始终传第二个参数
 *  ③ parseFloat() 用于字符串 如果第一个字符不是数值字符、加号或减号则立即返回NaN
 *                  如果第一个字符是其一，则继续检查碰到非数值字符即结束，截取前面的部分作为结果
 *                  第一次小数点有效，第二次小数点无效，
 *                  始终忽略字符串开头的0，所以只能解析十进制格式，不能指定底数(进制数)
 *                  如果字符串没有小数点或小数点后只有一个0，将返回整数
 */
//布尔值
console.log(Number(true)) //1
console.log(Number(false)) //0

//数值直接返回

//null
console.log(Number(null)) //0

//undefined
console.log(Number(undefined)) //NaN

//字符串
//忽略前面的0
//可以转其他进制
//空字符串返回0
//转不了的返回NaN
console.log(Number('011')) //11
console.log(Number('011.1')) //11.1
console.log(Number('0xf')) //15
console.log(Number('0o11')) //9
console.log(Number('')) //0

//parseInt
console.log(parseInt('')) //NaN
console.log(parseInt('1a11')) //1
console.log(parseInt('a1a11')) //NaN
console.log(parseInt('0x13', 16)) //16进制 19

//parseFloat
console.log(parseFloat('-11.1')) //-11.1
console.log(parseFloat('-11.0')) //-11
